#ifndef PROJECT_P_H
#define PROJECT_P_H

#include <cstddef>
#include <string>
#include <vector>
#include <set>
#include <map>

typedef struct ProjectTarget {
    std::string               target_bin;
    std::vector<std::string>  target_files;
    std::set<std::string>     extracted_files;
    std::vector<std::string>  project_includedirs;
    std::vector<std::string>  project_linktargets;// TODO: remove it?
    std::map< std::string, std::vector<std::string> > target_filesets;// TODO: remove it?
} ProjectTarget;

typedef struct ProjectBuildOptionFlags {
    /// preprocessor
    std::vector<std::string>  defined_marcos;
    /// optimize
    int optimize_level;
    /// compiler
    int fast_float_point;
    bool check_func_heapstack;
    /// misc
    bool with_debug_symbol;
    bool warning_all;
    bool warning_as_error;
} ProjectBuildOptionFlags;

class ProjectPrivate {
    public:
        static ProjectPrivate* self();
        ~ProjectPrivate();
        bool                is_modified;
        std::string         project_mainfile;
        std::string         project_basedir;
        std::string         project_name;
        std::vector<ProjectTarget> project_targets;//TODO: multi target support?
        ProjectBuildOptionFlags optflags;
    private:
        static ProjectPrivate* m_self;
        ProjectPrivate();
};

#endif // PROJECT_P_H
